import { app, shell, BrowserWindow, Menu, nativeTheme, globalShortcut } from 'electron'
import { join } from 'path'
import { electronApp, is } from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'
import { setupIpcHandlers } from './ipc'
import WinState from 'electron-win-state'
import { createMenuTemplate } from './config/menu'
import { getShortcuts } from './config/shortcuts'

const winState = new WinState({
  defaultWidth: 800,
  defaultHeight: 600
})

function createWindow(): void {
  // 设置暗色主题
  nativeTheme.themeSource = 'dark'

  // 创建浏览器窗口。
  const mainWindow = new BrowserWindow({
    ...winState.winOptions,
    icon: join(__dirname,'../../resources/icon.png'),
    show: false,
    ...(process.platform === 'linux' ? { icon } : {}),
    autoHideMenuBar: false,      // 不隐藏菜单栏
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'),
      sandbox: false,
      nodeIntegration: false,
      contextIsolation: true
    }
  })


  // 创建并设置菜单
  const menu = Menu.buildFromTemplate(createMenuTemplate(mainWindow))
  Menu.setApplicationMenu(menu)

  // 获取快捷键配置
  const shortcuts = getShortcuts(mainWindow)

  // 当窗口获得焦点时注册快捷键
  mainWindow.on('focus', () => {
    for (const [accelerator, callback] of Object.entries(shortcuts)) {
      globalShortcut.register(accelerator, callback)
    }
  })

  // 当窗口失去焦点时注销快捷键
  mainWindow.on('blur', () => {
    globalShortcut.unregisterAll()
  })

  // 当窗口关闭时注销快捷键
  mainWindow.on('closed', () => {
    globalShortcut.unregisterAll()
  })

  // 当窗口准备好显示时，显示窗口
  // 这样可以避免加载过程中的白屏闪烁
  mainWindow.on('ready-to-show', () => {
    mainWindow.show()
  })

  // 处理新窗口打开请求
  // 将所有外部链接在默认浏览器中打开，而不是在应用内打开新窗口
  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url)
    return { action: 'deny' }  // 阻止在应用内创建新窗口
  })

  // 基于 electron vite cli的渲染器HMR。
  // 加载用于开发的远程URL或用于生产的本地html文件。
  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL'])
  } else {
    mainWindow.loadFile(join(__dirname, '../renderer/index.html'))
  }

  // 保存当前用户的缩放状态
  winState.manage(mainWindow)
}

// 当Electron完成时，将调用此法
// 初始化，并准备创建浏览器窗口。
// 某些API只能在该事件发生后使用
app.whenReady().then(() => {
  electronApp.setAppUserModelId('com.electron')

  // 确保数据库初始化
  import('./db').then(async () => {
    console.log('数据库初始化完成')

    setupIpcHandlers()
    createWindow()

  }).catch(err => {
    console.error('数据库初始化失败:', err)
  })

  app.on('activate', function () {
    // 在macOS上，当
    // 单击dock图标，并且没有打开其他窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// 关闭所有窗口时退出，macOS上除外。在那里，这很常见
// 使应用程序及其菜单栏保持活动状态，直到用户退出
// 用Cmd+Q显式显示。
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 在此文件中，您可以包含应用程序特定主进程的其余部分
// 代码。您也可以将它们放在单独的文件中，并在此处要求它们。
